使用Java操作Redis的两种方式Jedis、RedisTemplate |
您所在的位置:网站首页 › java 操作redis › 使用Java操作Redis的两种方式Jedis、RedisTemplate |
各位小伙伴们大家好,欢迎来到这个小扎扎的Redis 6专栏,在这个系列专栏中我对B站黑马的Redis教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
基于目前的使用状况,我们先学习Jedis的原生API,然后再学习Spring整合Spring Data Redis框架,该框架底层很好的兼容了Jedis和Lettuce 🍖 Jedis的使用 🥩 Jedis快速入门官网地址: https://github.com/redis/jedis 第一步: 导依赖 redis.clients jedis 3.7.0 org.junit.jupiter junit-jupiter 5.7.0第二步: 与redis建立连接,在Java中的体现就是实例化一个Jedis对象,构造器的参数需要虚拟机的ip地址,可以使用如下命令查看 第三步: 测试各种添加查询操作,API的名和redis的命令一致,其他操作参考redis的命令 /** * K-V的测试 * @Param void * @return */ @Test void testHash() { Map map = new HashMap(); map.put("id", "1"); map.put("username", "zhagnsan"); map.put("age", "20"); // 存入数据 jedis.hset("user", map); // 获取命令 Set userKeys = jedis.hkeys("user"); List userValues = jedis.hvals("user"); // 输出获取的结果 System.out.println(userKeys); System.out.println("============================"); System.out.println(userValues); }第四步: 断开连接 /** * 关闭连接 @AfterEach表示每个方法执行之后都需要执行该方法 * @Param void * @return */ @AfterEach void tearDown() { if (jedis != null) { jedis.close(); } } redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket.如果报上面的错误连接不上的话,可以参考这篇博客https://blog.csdn.net/qq_44624536/article/details/120213607,如果还是无法解决的话,很有可能就是虚拟机的防火墙没有关闭,可以使用如下命令查看并关闭一下(我的就是这个错误原因) # 查看防火墙状态的命令 systemctl status firewalld # 关闭防火墙的命令 systemctl stop firewalld
上面说过Jedis本身是线程不安全的,如果在多线程并发操作下极有可能出现线程安全问题,因此在并发的环境下,一定要为每一个线程创建一个独立的线程对象。但是频繁的创建销毁连接会导致性能损耗,因此需要使用到Jedis连接池来代替Jedis的直接连接方式。 第一步: 使用工具类创建并配置连接池对象,并使用静态方法返回连接 public class JedisConnectionFactory { private static final JedisPool JEDIS_POOL; static { // 配置连接池 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 设置最大连接数、最大空闲连接、最小空闲连接、设置无连接的等待时间(毫秒为单位) jedisPoolConfig.setMaxTotal(8); jedisPoolConfig.setMaxIdle(8); jedisPoolConfig.setMinIdle(0); jedisPoolConfig.setMaxWaitMillis(1000); // 创建连接池对象 JEDIS_POOL = new JedisPool(jedisPoolConfig, "你的虚拟机ip", 6379, 1000, "你的redis密码"); } public static Jedis getJedis() { return JEDIS_POOL.getResource(); } }第二步: 调用静态方法建立连接即可,剩下的操作都一样 @BeforeEach void setUp() { // 建立连接 jedis = JedisConnectionFactory.getJedis(); // 选择使用的库 默认是0号库 jedis.select(0); } 🍖 SpringBoot整合RedisTemplate 🥩 自定义配置RedisTemplate第一步: 导入SpringBoot整合RedisTemplate的依赖,连接池的依赖,SpringBoot项目不用指定技术版本,继承使用父工程中已经配置好的版本 org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2第二步: 配置信息 spring: redis: host: 你的虚拟机ip port: 6379 password: 你的redis密码 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 1000第三步: 直接注入redisTemplate对象,使用它内部的API @Autowired private RedisTemplate redisTemplate; @Test void contextLoads() { redisTemplate.opsForValue().set("name", "zhangsan"); Object name = redisTemplate.opsForValue().get("name"); System.out.println("name ==>" + name); }结果显示并没有问题,可以正常的存入读出 由于使用到了JSON所以需要导入相关依赖,如果导入mvc的依赖的话会默认导入JSON但是,我们的项目没有导MVC也没有JSON,所以需要导一下 com.fasterxml.jackson.core jackson-databind
由于上面使用配置类自定义序列化的方式,导致序列化之后的字符串会带",而且Jason对象序列化之后会带有类的全限定名,数据量大了之后也会影响到存储的性能。于是出现了StringRedisTemplate,这种模板很好的解决了上述问题,但是需要我们手动的将对象进行序列化和反序列化 @SpringBootTest public class StringRedistemplateTest { @Autowired private StringRedisTemplate stringRedisTemplate; @Test void contextLoads() { stringRedisTemplate.opsForValue().set("name", "lisi"); Object name = stringRedisTemplate.opsForValue().get("name"); System.out.println("name ==>" + name); } // 创建ObjectMapper对象用于序列化和反序列化 private static final ObjectMapper MAPPER = new ObjectMapper(); @Test void test01() throws JsonProcessingException { // 创建user对象 并序列化对象 User user = new User("zhangsan", 20); String userJson = MAPPER.writeValueAsString(user); // 写数据 stringRedisTemplate.opsForValue().set("user", userJson); // 读数据并反序列化输出 String res = stringRedisTemplate.opsForValue().get("user"); User jsonUser = MAPPER.readValue(res, User.class); System.out.println("user ==> " + jsonUser); } } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |